package com.sugon.modules.analyse.service;

import com.sugon.modules.analyse.model.BarChartOptionModel;
import com.sugon.modules.analyse.model.chart.PieChartOptionDataVO;
import com.sugon.modules.analyse.model.vo.*;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.List;
import java.util.Map;

/**
 * 设备统计分析Service
 *
 * @author YuXD
 */
public interface IDeviceAnalyseService {

    /**
     * 统计指定时间段以内的设备PM工单数量分布统计，以月为单位
     * 每月数据包括：完成和延期工单数
     * 最近一个月显示已完成的周次的完成和延期工单数对比
     *
     * @param param
     * @return
     */
    BarChartOptionModel<Integer> doStatDevPmTicketNumDistribution(Map<String, Object> param);

    /**
     * 统计指定时间段以内的设备AM工单数量分布统计，以月为单位
     * 每月数据包括：完成和延期工单数
     * 最近一个月显示已完成的周次的完成和延期工单数对比
     *
     * @param param
     * @return
     */
    BarChartOptionModel<Integer> doStatDevAmTicketNumDistribution(Map<String, Object> param);

    /**
     * 统计指定时间段以内的设备维修工单数量分布统计，以月为单位
     * 最近一个月显示已完成的周次的完成和延期工单数对比
     *
     * @param param
     * @return
     */
    BarChartOptionModel<Integer> doStatDevRepairTicketNumDistribution(Map<String, Object> param);

    /**
     * 获取故障时间统计
     *
     * @param param
     * @return
     */
    BarChartOptionModel getFaultDurationStat(Map<String, Object> param);

    /**
     * 获取故障工单时间统计
     *
     * @param param
     * @return
     */
    PieChartOptionDataVO getWorkExecuteAvgStat(Map<String, Object> param);

    /**
     * 设备维修工单统计，统计本周或本月的各状态工单数统计
     *
     * @param statType   统计类别 WEEKLY,MONTHLY
     * @param workshopId 车间ID
     * @return
     */
    PieChartOptionDataVO loadDevRepairTicketStat(String statType, String workshopId);

    /**
     * 设备维护工单统计，统计本周或本月的各状态工单数统计
     *
     * @param statType   统计类别 WEEKLY,MONTHLY
     * @param workshopId 车间ID
     * @return
     */
    PieChartOptionDataVO loadDevMaintenanceTicketStat(String statType, String workshopId);

    /**
     * 故障处理时长TOP工单统计
     *
     * @param param
     * @return
     */
    List<FaultHandleDurationTopWorkVO> faultHandleDurationTopWorkStat(Map<String, Object> param);

    /**
     * 统计组织下维护计划和报修工单状态数目
     *
     * @param deptCode
     * @return
     */
    DeptWorkAndMaintainStat deptMaintainNumStat(String deptCode);

    /**
     * 统计指定月份的设备故障大类别发生次数和累计百分比
     *
     * @param month 查询参数，包含月份
     * @return
     */
    DevFaultTypeTimeStat statDevFaultTypeTimeAndRate(String month);

    /**
     * 统计发生故障的TOP设备
     *
     * @return
     */
    FaultTopStatVO doDevFaultTopStat(Map<String, Object> param);

    /**
     * 统计设备指定参数折线图需要的数据
     *
     * @param params
     * @return
     */
    DevParamLineChartDataVO loadDeviceParamLineData(Map<String, Object> params);

    /**
     * 统计不同状态下的设备数
     *
     * @param params
     * @return
     */
    PieChartOptionDataVO statDevStatusNum(Map<String, Object> params);

    /**
     * 统计基地设备PM完成率
     * 默认统计近半年的
     *
     * @param params
     * @return
     */
    PieChartOptionDataVO statDevPmCompleteRate(Map<String, Object> params);

    /**
     * 统计工场所有模具状态下的模具统计数据
     *
     * @return
     */
    BarChartOptionModel statDeviceAlarmRepairCompare(Map<String, Object> params);

    /**
     * 设备报警时长TOM统计
     *
     * @param params
     * @return
     */
    List<DevAlarmTimeTopStatVO> statDeviceAlarmTimeTop(Map<String, Object> params);

    /**
     * 加载设备列表
     *
     * @param devCode 设备编码
     * @return
     */
    List<Map<String, Object>> loadDevParamList(String devCode);


    /**
     * 根据设备组织CODE和月份统计区域设备故障次数
     *
     * @param dcode 设备组织CODE
     * @param month 月份
     * @return
     */
    BarChartOptionModel doAreaDeviceFaultTimeStat(String dcode, String month);

    /**
     * 按照月份统计指定组织下的维修工作量
     * 工作量包括维修+维护
     *
     * @param param 查询参数
     */
    BarChartOptionModel doRepairWorkStat(Map<String, Object> param);

    /**
     * 根据设备CODE获取单台设备监控数据，数据包括
     * 1、设备报警数
     * 2、设备故障次数
     * 3、设备当前状态
     * 4、替换备件列表
     * 5、设备编号和设备图片
     * 6、设备报警和故障次数对比
     * 7、设备运行状态时间分布
     *
     * @param devCode 设备编码
     * @return
     */
    Map<String, Object> deviceMonitor(@RequestParam String devCode);

}
